package cn.edu.hitsz.compiler.parser;
import cn.edu.hitsz.compiler.lexer.Token;
import cn.edu.hitsz.compiler.parser.table.NonTerminal;
import cn.edu.hitsz.compiler.symtab.SourceCodeType;


public class SemanticElement {
    private final Token token;       // 终结符
    private final NonTerminal nonTerminal; // 非终结符的名称，用 null 表示当前元素不是非终结符
    private SourceCodeType type;

    // 构造函数用于初始化终结符
    public SemanticElement(Token token) {
        this.token = token;
        this.nonTerminal = null; // 表示这是一个终结符
        this.type=null;
    }

    // 构造函数用于初始化非终结符
    public SemanticElement(NonTerminal nonTerminal,SourceCodeType sourceCodeType) {
        this.token = null;       // 表示这是一个非终结符
        this.nonTerminal = nonTerminal;
        this.type=sourceCodeType;
    }

    public SemanticElement(NonTerminal nonTerminal) {
        this.token = null;       // 表示这是一个非终结符
        this.nonTerminal = nonTerminal;
        this.type=null;
    }

    // 判断是否为终结符
    public boolean isTerminal() {
        return token != null;
    }

    // 获取终结符
    public Token getToken() {
        return token;
    }

    // 获取非终结符
    public NonTerminal getNonTerminal() {
        return nonTerminal;
    }


    @Override
    public String toString() {
        return isTerminal() ? token.getText() : nonTerminal.toString();
    }

    // 设置类型
    public void setType(SourceCodeType type) {
        this.type = type;
    }

    // 获取类型
    public SourceCodeType getType() {
        return type;
    }
}
